//
// Created by Administrator on 24-8-26.
//
#include "KeyScan.h"
uint8_t Key_row[1]={0xff};   //保存按键行扫描情况的状态数组

void Keypad_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 初始化列引脚为输出
    GPIO_InitStruct.Pin = KEY_COL_PIN_0 | KEY_COL_PIN_1 | KEY_COL_PIN_2 | KEY_COL_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStruct);

    // 初始化行引脚为输入，并使能上拉
    GPIO_InitStruct.Pin = KEY_ROW_PIN_0 | KEY_ROW_PIN_1 | KEY_ROW_PIN_2 | KEY_ROW_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStruct);
}

#define DEBOUNCE_DELAY 50 // 去抖动延迟时间（毫秒）

char Keypad_Scan(void) {
    // 遍历每一列
    for (uint8_t col = 0; col < 4; col++) {
        // 先将所有列引脚拉高
        HAL_GPIO_WritePin(KEY_GPIO_PORT, KEY_COL_PIN_0 | KEY_COL_PIN_1 | KEY_COL_PIN_2 | KEY_COL_PIN_3, GPIO_PIN_SET);

        // 将当前列引脚拉低
        HAL_GPIO_WritePin(KEY_GPIO_PORT, (KEY_COL_PIN_0 << col), GPIO_PIN_RESET);

        // 遍历每一行
        for (uint8_t row = 0; row < 4; row++) {
            if (HAL_GPIO_ReadPin(KEY_GPIO_PORT, (KEY_ROW_PIN_0 << row)) == GPIO_PIN_RESET) {
                HAL_Delay(DEBOUNCE_DELAY); // 等待去抖动
                if (HAL_GPIO_ReadPin(KEY_GPIO_PORT, (KEY_ROW_PIN_0 << row)) == GPIO_PIN_RESET) {
                    // 返回对应按键
                    return keyMap[row][col];
                }
            }
        }
    }
    // 如果没有按键按下，返回0
    return 0;
}
